#! /usr/bin/python
# encoding=utf-8
# Created by Fenglu Niu on 2025/5/6 11:15
import json
import os
from datetime import datetime
from typing import List

import requests
from dotenv import load_dotenv
from fastapi import FastAPI
from mcp.server import FastMCP
from mcp.server.fastmcp import Context

from common.ali_stu_analysis_api import AliStuAnalysisApi
from common.dify import Dify
from common.school_api import SchoolApi
from hk_mcp import skycon_desc

app = FastAPI()
mcp = FastMCP('hk-ai')


@mcp.tool('retrieve')
def retrieve(text: str, agents: List[str]) -> List[str]:
    """
    检索知识库
    Args:
        text: 检索知识库的文本，尽量保留用户问题
        agents: 当前服务的小宝序号,例：["1"] （数组，元素都要转为字符串）
    Returns:
        检索的知识库内容列表
    """
    load_dotenv()
    result = []
    for agent in agents:
        dataset_id = os.getenv(f'DIFY_DATASET_ID_{agent}')
        dify = Dify()
        result.append(dify.retrieve(text, dataset_id))
    return result


@mcp.tool('get_weather')
def get_weather(city: str, date: str) -> str:
    """
    获取天气
    Args:
        city: 城市 (string)
        date: 日期 格式：2025-05-06 (string)
    :param city: 城市
    :param date: 日期 格式：2025-05-06
    Returns:
        天气情况
    """
    now = datetime.now()
    if not date:
        date = datetime.now().strftime('%Y-%m-%d')

    delta = datetime.strptime(date, '%Y-%m-%d') - now
    if delta.days >= 2:
        return '暂不支持查询未来3天的天气'

    location = '113.806795,34.786429'
    url = f'https://api.caiyunapp.com/v2.6/xmTQntHxiq2JWQoU/{location}/daily?dailysteps=3'
    resp = requests.get(url).json()
    if resp.get('status') != 'ok':
        return f'获取天气失败了，status:{resp.get("status")}'

    weather = ''
    # 获取温度
    for temp in resp.get('result').get('daily').get('temperature'):
        if date in temp.get('date'):
            weather += f'温度：{temp.get("min")}℃~{temp.get("max")}℃,平均气温{temp.get("avg")}℃\n'
            break
    # 获取降水概率
    for precip in resp.get('result').get('daily').get('precipitation'):
        if date in precip.get('date'):
            weather += f'降水概率：{precip.get("probability")},平均降水量：{precip.get("avg")}毫米\n'
            break
    # 获取天气现象
    for skycon in resp.get('result').get('daily').get('skycon'):
        if date in skycon.get('date'):
            weather += f'天气：{skycon_desc.get(skycon.get("value"))}\n'
            break
    return weather

@mcp.tool()
def get_student_info(stu_no: str):
    """
    获取学生信息
    :param stu_no: 学号
    :return: 学生的信息
    """
    return SchoolApi().get_stu_info(stu_no)

@mcp.tool()
def get_student_loan(stu_no: str):
    """
    获取学生助学贷款
    :param stu_no: 学号
    :return: 学生的助学贷款信息
    """
    return SchoolApi().get_stu_loan(stu_no)

@mcp.tool()
def get_student_leave(stu_no: str):
    """
    获取学生请假信息
    :param stu_no: 学号
    :return: 学生的请假信息
    """
    return SchoolApi().get_stu_leave(stu_no)

@mcp.tool()
def get_student_book(stu_no: str):
    """
    获取学生借阅的图书
    :param stu_no: 学号
    :return: 学生的借阅图书信息
    """
    return SchoolApi().get_stu_book(stu_no)

@mcp.tool()
def get_student_dormitory(stu_no: str):
    """
    获取学生宿舍信息
    :param stu_no: 学号
    :return: 学生的宿舍信息
    """
    return SchoolApi().get_stu_dormitory(stu_no)

@mcp.tool()
def get_student_grade(stu_no: str, course_name: str):
    """
    获取学生成绩，当课程名称为空时，获取所有课程成绩
    :param stu_no: 学号
    :param course_name: 课程名称
    :return: 学生的课程成绩
    """
    return SchoolApi().get_stu_grade(stu_no, course_name)

@mcp.tool()
def get_student_course_plan(stu_no: str, date: str):
    """
    获取学生课程安排
    :param stu_no: 学号
    :param date: 排课日期 格式：2025-05-06
    :return: 学生的课程安排
    """
    return SchoolApi().get_stu_course_plan(stu_no, date)

@mcp.tool()
def get_group_plan(starttime: str):
    """
    获取社团活动
    :param starttime: 开始时间（默认明天）
    :return: 获取社团活动
    """
    return SchoolApi().get_group_plan(starttime)


# @mcp.tool()
# def stu_analysis(stu_grade: dict):
#     """
#     学情分析，根据学生成绩分析学生的学习情况
#     :param stu_grade: 学生的成绩 不限格式 可来自获取学生成绩接口。可来自历史会话
#     :return: 学情分析结果
#     """
#     return AliStuAnalysisApi().invoke(json.dumps(stu_grade))

@mcp.tool()
def get_jobs(keyword: str):
    """
    获取职位信息
    :param keyword: 搜索关键字职位名称，职位描述，所属行业，公司名称（string）
    :return: 职位列表
    """
    return SchoolApi().get_jobs(keyword)



app.mount('/', mcp.sse_app())
if __name__ == '__main__':
    import uvicorn

    uvicorn.run(app, host='0.0.0.0', port=8000)
